package org.starapp.generator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.starapp.utils.ListUtils;
import org.starapp.utils.StringUtils;

public class TableUtils {

	// 外键<tableName,foreignKey>
	private static Map<String, List<RefField>> fkMap = new HashMap<String, List<RefField>>();
	private static Map<String, List<ForeignKey>> mmMap = new HashMap<String, List<ForeignKey>>();

	/**
	 * 第二次处理 从FKS，PKS中找信息
	 * 
	 * @param tables
	 */
	private static void buildOne(List<Table> tables) {
		if (ListUtils.isEmpty(tables)) {
			return;
		}
		Table table = null;
		for (int i = 0; i < tables.size(); i++) {
			// PKS
			table = tables.get(i);
			String pkstr = "";
			String fkstr = "";
			List<RefField> pkList = null;
			RefField field = null;
			List<PrimaryKey> pks = table.getPrimaryKeys();
			if (!ListUtils.isEmpty(pks)) {
				for (PrimaryKey pk : pks) {
					pkstr = (StringUtils.isEmpty(pkstr) ? pk.getColumnName()
							: pkstr + "," + pk.getColumnName());
				}
			}
			List<ForeignKey> fks = table.getForeignKeys();
			if (!ListUtils.isEmpty(fks)) {
				for (ForeignKey fk : fks) {
					//
					fkstr = (StringUtils.isEmpty(fkstr) ? fk.getFkColumnName()
							: fkstr + "," + fk.getFkColumnName());
					//
					pkList = fkMap.get(fk.getPkTableName());
					if (ListUtils.isEmpty(pkList)) {
						pkList = new ArrayList<RefField>();
					}
					field = new RefField();
					field.setClassAttrName(table.getClassAttrName());
					field.setClassName(table.getClassName());
					field.setRefTypeName(fk.getFkTableName().equals(
							fk.getPkTableName()) ? "one2one" : "one2many");
					field.setRefColumnName(fk.getFkColumnName());
					field.setRefTableName(fk.getPkTableName());
					field.setColumnName(fk.getFkColumnName());
					field.setTableName(fk.getFkTableName());
					pkList.add(field);

					fkMap.put(fk.getPkTableName(), pkList);
				}
			}
			// 如果是关系表，则不显示
			if (StringUtils.isNotBlank(pkstr) && StringUtils.isNotBlank(fkstr)) {
				String[] p = pkstr.split(",");
				boolean tag = false;
				if (p != null && p.length > 1) {
					for (int t = 0; t < p.length; t++) {
						if (fkstr.indexOf(p[t]) == -1) {
							tag = false;
							break;
						}else{
							tag=true;
						}
					}
				}
				if (tag) {
					table.setHidden(true);
					tables.set(i, table);
					mmMap.put(table.getTableName(), fks);
				}
			}

		}
	}

	/**
	 * 第二次处理
	 * 
	 * @param tables
	 */
	private static void buildTwo(List<Table> tables) {
		if (ListUtils.isEmpty(tables)) {
			return;
		}

		List<TableField> fields = null;
		for (Table table : tables) {
			if (fkMap.get(table.getTableName()) != null) {
				table.setRefs(fkMap.get(table.getTableName()));
			}
			fields = table.getFields();
			TableField field = null;
			for (int j = 0; j < fields.size(); j++) {
				field = fields.get(j);
				field.setDisplay("Y");
				if (!ListUtils.isEmpty(table.getForeignKeys())) {
					for (ForeignKey fk : table.getForeignKeys()) {
						if (field.getColumnName().equals(fk.getFkColumnName())) {
							field.setDisplay("N");
						}
					}
				}
				fields.set(j, field);
			}
			table.setFields(fields);

		}
	}

	/**
	 * 第三次处理
	 * 
	 * @param tables
	 */
	private static void buildThree(List<Table> tables) {
		if (ListUtils.isEmpty(tables)) {
			return;
		}
		Table table = null;
		for (int i = 0; i < tables.size(); i++) {
			table = tables.get(i);
			if (table != null) {
				// //去掉重复的字段
				if (!ListUtils.isEmpty(table.getRefs())) {
					List<RefField> ll = table.getRefs();
					for (int g = 0; g < ll.size(); g++) {
						RefField re = ll.get(g);
						List<ForeignKey> fks = mmMap.get(re.getTableName());
						if (fks != null) {
							int tag=0;
							for (ForeignKey fk : fks) {
								tag=tag+1;
								if (!re.getColumnName().equals(
										fk.getPkColumnName())) {
									re.setRefColumnName(fk.getPkColumnName());
									re.setRefTypeName("many2many");
									re.setRefTableName(re.getTableName());
									re.setRefClassName(fk.getPkJavaClassName());
									re.setRefClassAttrName(fk
											.getPkJavaClassAttrName());

									re.setTableName(table.getTableName());
									re.setClassName(table.getClassName());
									re.setClassAttrName(table
											.getClassAttrName());
									if(tag>1){
										re.setMapperBy("N");
									}else{
										re.setMapperBy("Y");
									}
									ll.set(g, re);
								}
							}
						}
					}
				}
			}
		}

	}

	/**
	 * 第四次处理
	 * 
	 * @param tables
	 */
	private static void buildFour(List<Table> tables) {
		if (ListUtils.isEmpty(tables)) {
			return;
		}
		Table table = null;
		for (int i = 0; i < tables.size(); i++) {
			table = tables.get(i);
			if (table != null) {
				// //去掉重复的字段
				if (!ListUtils.isEmpty(table.getRefs())) {
					List<RefField> ll = table.getRefs();
					for (int g = 0; g < ll.size(); g++) {
						RefField re = ll.get(g);
						List<ForeignKey> fks = mmMap.get(re.getClassName());
						if (fks != null) {
							ll.remove(re);
							if (g > 0) {
								g = g - 1;
							}
						}
					}
				}
			}
		}
	}

	public static void convertTableData(List<Table> tables) {
		if (ListUtils.isEmpty(tables)) {
			return;
		}
		// 第一次处理
		buildOne(tables);
		// 第二次处理
		buildTwo(tables);
		// 第三次处理
		buildThree(tables);
		// 第四次处理
		buildFour(tables);

	}

}
